package com.nerve.cloudoffice.domain.dao;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.nerve.cloudoffice.common.HibernateUnit;
import com.nerve.cloudoffice.common.HibernateUtil;


/**
 * 操作数据库的父类，有添加，删除，update，getById等方法<br>
 * 使用了java中的泛型<br>
 * @author 集成显卡
 *	@time 2010.12.4
 *
 *	更改记录：将代码修改一下，使用全局变量的session，而不是像之前的一个方法得到一个新的session   2011.1.1 15：22
 *
 */
@SuppressWarnings("unchecked")
public class SuperDAO<T> {

	private Class<T> clazz;
	protected Session session;//这个就是session了，因为要给子类使用，所以是protected
	
	private static final String ROW_COUNT = "select count(*)";
	
	
	public SuperDAO(){
		//得到一个class?
		clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		
		//实例化session
		if(session==null){
			session= HibernateUtil.currentSession();
		}
	}
	
	/**
	 * @方法名称 :commit
	 * @功能描述 :提交事务
	 * @返回值类型 :void
	 *
	 * @创建日期 :Jan 1, 2011
	 * @修改记录 :
	 */
	public void commit(){
		session.beginTransaction().commit();
	}
	
	
	/**
	 * 保存一个实例信息<br>
	 * @param entity
	 */
	public void save(T entity){
		session.save(entity);
		commit();
	}
	
	public void merge(T entity){
		session.merge(entity);
		commit();
	}
	
	/**
	 * 删除一个实例信息<br>
	 * @param entity
	 */
	public void delete(T entity){
		session.delete(entity);
		commit();
	}
	
	/**
	 * 根据id删除
	 * @param id
	 */
	public void delete(int id){
		session.beginTransaction();
		session.createQuery("delete "+clazz.getName() +" where id="+id).executeUpdate();
		commit();
	}
	
	/**
	 * 更新一个实例信息<br>
	 * @param entity
	 */
	public void update(T entity){
		session.update(entity);
		commit();
	}
	
	/**
	 * 根据id得到一个对象<br>
	 * @param id
	 * @return
	 */
	public T getById(Integer id){
		T result=(T)session.get(clazz, id);
		return result;
	}
	
	/**
	 * 得到一个list<br>
	 * @return
	 */
	public List<T> getList(){
		String hql="from "+clazz.getName()+" as t order by t.id asc";
		List<T> result=session.createQuery(hql).list();
		return result;
	}
	
	/**
	 * @方法名称 :getList
	 * @功能描述 :通过指定字段的值匹配相应的list,这个字段对应的数据类型是Integer
	 * @返回值类型 :List<T>
	 *	@param column
	 *	@param info
	 *	@return
	 *
	 * @创建日期 :Dec 11, 2010
	 * @修改记录 :
	 */
	public List<T> getList(String column,int info){
		String hql="from "+clazz.getName()+" where "+column+"=:info order by id asc";
		List<T> result=session.createQuery(hql).setParameter("info", info).list();
		return result;
	}
	
	/**
	 * @方法名称 :getList
	 * @功能描述 :根据两个字段的值匹配得到一个List
	 * @返回值类型 :List<T>
	 *	@param column1
	 *	@param info1
	 *	@param column2
	 *	@param info2
	 *	@return
	 *
	 * @创建日期 :Dec 14, 2010
	 * @修改记录 :
	 */
	public List<T> getList(String column1,int info1,String column2,int info2){
		String hql="from "+clazz.getName()+" where "+column1+"=:info1 and "+column2+"=:info2";
		List<T> result=session.createQuery(hql).setParameter("info1", info1).setParameter("info2", info2).list();
		return result;
	}
	
	/**
	 * 根据指定的列名的值得到一个对象<br>
	 * @param column
	 * @param info
	 * @return
	 */
	public T getByInfo(String column,Object info){
		String hql="from "+clazz.getName()+" where "+column+"=:info";
		T result=null;
		try{
			result=(T)session.createQuery(hql).setParameter("info", info).list().get(0);
		}
		catch(Exception e){}
		return result;
	}
	
	/**
	 * @方法名称 :getByInfo
	 * @功能描述 :根据两个字段的信息匹配一个值，并返回，这个主要用于id和pass登录验证使用
	 * @返回值类型 :T
	 * @param column1
	 * @param info1
	 * @param column2
	 * @param info2
	 * @return
	 *
	 * @创建日期 :Dec 8, 2010
	 * @修改记录 :
	 */
	public T getByInfo(String column1,String info1,String column2,String info2){

		String hql="from "+clazz.getName()+" where "+column1+"=:info1 and "+column2+"=:info2";
		T result=null;
		try{
			result=(T)session.createQuery(hql).setParameter("info1", info1).setParameter("info2", info2).list().get(0);
		}
		catch(Exception e){}

		return result;
	}
	/**
	 * @方法名称 :getList
	 * @功能描述 :分页好用啊这个
	 * @返回值类型 :List<T>
	 *	@param column
	 *	@param info
	 *	@param orderBy
	 *	@param curPage
	 *	@param pageCount
	 *	@return
	 *
	 * @创建日期 :Feb 27, 2011
	 * @修改记录 :
	 */
	public List<T> getList(int curPage,int pageCount){
		String hql="from "+clazz.getName();
		return getList(hql, curPage, pageCount);
	}
	
	/**
	 * 分页搜索
	 * @param hql
	 * @param curPage
	 * @param pageCount
	 * @return
	 */
	public List<T> getList(String hql, int curPage, int pageCount){
		List<T> result=session.createQuery(hql).setFirstResult((curPage-1)*pageCount).setMaxResults(pageCount).list();
		return result;
	}
	
	/**
	 * 获取最大的页数
	 * 
	 * @param hql
	 * @return
	 */
	public int countRow(String hql){
		System.out.println("hql="+hql);
		int formIndex = hql.toLowerCase().indexOf("from");
		String formSql = hql.substring(formIndex);
		
		formIndex = formSql.toLowerCase().indexOf("order by");
		if(formIndex > 0){
			formSql = formSql.substring(0, formIndex);
		}
		formSql = ROW_COUNT + formSql;
		System.out.println("page sql:" + formSql);
		
		Query q = session.createQuery(formSql);
		
		return ((Number)q.iterate().next()).intValue();
	}
	
	public void closeSession(){
		HibernateUnit.freeSession(session);
	}
	
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("---------------Close Session----------------------");
		//HibernateUnit.freeSession(session);
	}
}